🎖️GitЯра🎖️
Node / meshtastic / Meshtastic-Android / files / core / data / src / commonMain / kotlin / org / meshtastic / core / data / repository / NodeRepositoryImpl.kt
Displaying Raw • Download
core/data/src/commonMain/kotlin/org/meshtastic/core/data/repository/NodeRepositoryImpl.kt dda971b5ce81ed5dd9549dbaba1d8548bbfa4126 (dda971b5) Text, 13.07 KB
T8b949e/*
* Copyright (c) 2026 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
Tff7b72package T7ee787org.meshtastic.core.data.repository
Tff7b72import T7ee787androidx.lifecycle.Lifecycle
Tff7b72import T7ee787androidx.lifecycle.coroutineScope
Tff7b72import T7ee787androidx.lifecycle.repeatOnLifecycle
Tff7b72import T7ee787kotlinx.coroutines.flow.Flow
Tff7b72import T7ee787kotlinx.coroutines.flow.MutableStateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.SharingStarted
Tff7b72import T7ee787kotlinx.coroutines.flow.StateFlow
Tff7b72import T7ee787kotlinx.coroutines.flow.combine
Tff7b72import T7ee787kotlinx.coroutines.flow.conflate
Tff7b72import T7ee787kotlinx.coroutines.flow.distinctUntilChanged
Tff7b72import T7ee787kotlinx.coroutines.flow.flowOn
Tff7b72import T7ee787kotlinx.coroutines.flow.launchIn
Tff7b72import T7ee787kotlinx.coroutines.flow.map
Tff7b72import T7ee787kotlinx.coroutines.flow.mapLatest
Tff7b72import T7ee787kotlinx.coroutines.flow.onEach
Tff7b72import T7ee787kotlinx.coroutines.flow.stateIn
Tff7b72import T7ee787kotlinx.coroutines.launch
Tff7b72import T7ee787kotlinx.coroutines.withContext
Tff7b72import T7ee787org.koin.core.annotation.Named
Tff7b72import T7ee787org.koin.core.annotation.Single
Tff7b72import T7ee787org.meshtastic.core.common.di.PROCESS_LIFECYCLE
Tff7b72import T7ee787org.meshtastic.core.data.datasource.NodeInfoReadDataSource
Tff7b72import T7ee787org.meshtastic.core.data.datasource.NodeInfoWriteDataSource
Tff7b72import T7ee787org.meshtastic.core.database.entity.MetadataEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.MyNodeEntity
Tff7b72import T7ee787org.meshtastic.core.database.entity.NodeEntity
Tff7b72import T7ee787org.meshtastic.core.datastore.LocalStatsDataSource
Tff7b72import T7ee787org.meshtastic.core.di.CoroutineDispatchers
Tff7b72import T7ee787org.meshtastic.core.model.MeshLog
Tff7b72import T7ee787org.meshtastic.core.model.MyNodeInfo
Tff7b72import T7ee787org.meshtastic.core.model.Node
Tff7b72import T7ee787org.meshtastic.core.model.NodeAddress
Tff7b72import T7ee787org.meshtastic.core.model.NodeSortOption
Tff7b72import T7ee787org.meshtastic.core.model.util.onlineTimeThreshold
Tff7b72import T7ee787org.meshtastic.core.repository.NodeRepository
Tff7b72import T7ee787org.meshtastic.proto.DeviceMetadata
Tff7b72import T7ee787org.meshtastic.proto.LocalStats
Tff7b72import T7ee787org.meshtastic.proto.User
T8b949e/** Repository for managing node-related data, including hardware info, node database, and identity. */
Tf0883e@Single
Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffTooManyFunctionsTa5d6ff"Tb4b4b4)
Tff7b72class T56d364NodeRepositoryImplTb4b4b4(
Tf0883e@NamedTb4b4b4(Te6edf3PROCESS_LIFECYCLETb4b4b4) Tff7b72private Tff7b72val Te6edf3processLifecycleTb4b4b4: Te6edf3LifecycleTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeInfoReadDataSourceTb4b4b4: Te6edf3NodeInfoReadDataSourceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3nodeInfoWriteDataSourceTb4b4b4: Te6edf3NodeInfoWriteDataSourceTb4b4b4,
Tff7b72private Tff7b72val Te6edf3dispatchersTb4b4b4: Te6edf3CoroutineDispatchersTb4b4b4,
Tff7b72private Tff7b72val Te6edf3localStatsDataSourceTb4b4b4: Te6edf3LocalStatsDataSourceTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3NodeRepository Tb4b4b4{
T8b949e/** Hardware info about our local device (can be null if not connected). */
Tff7b72override Tff7b72val Te6edf3myNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MyNodeInfo?Tff7b72> Tff7b72=
Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3myNodeInfoFlowTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTff7b72?.Te6edf3toMyNodeInfoTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4, Tff7b72nullTb4b4b4)
Tff7b72private Tff7b72val Te6edf3_ourNodeInfo Tff7b72= Te6edf3MutableStateFlowTff7b72<Te6edf3Node?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
T8b949e/** Information about the locally connected node, as seen from the mesh. */
Tff7b72override Tff7b72val Te6edf3ourNodeInfoTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3Node?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_ourNodeInfo
Tff7b72private Tff7b72val Te6edf3_myId Tff7b72= Te6edf3MutableStateFlowTff7b72<Tffa657String?Tff7b72>Tb4b4b4(Tff7b72nullTb4b4b4)
T8b949e/** The unique userId (hex string) of our local node. */
Tff7b72override Tff7b72val Te6edf3myIdTb4b4b4: Te6edf3StateFlowTff7b72<Tffa657String?Tff7b72>
Tff7b72getTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3_myId
T8b949e/** The latest local stats telemetry received from the locally connected node. */
Tff7b72override Tff7b72val Te6edf3localStatsTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3LocalStatsTff7b72> Tff7b72=
Te6edf3localStatsDataSourceTb4b4b4.Te6edf3localStatsFlowTb4b4b4.Te6edf3stateInTb4b4b4(
Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4,
Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4,
Te6edf3LocalStatsTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)
T8b949e/** Update the cached local stats telemetry. */
Tff7b72override Tff7b72fun Td2a8ffupdateLocalStatsTb4b4b4(Te6edf3statsTb4b4b4: Te6edf3LocalStatsTb4b4b4) Tb4b4b4{
Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4.Te6edf3launch Tb4b4b4{ Te6edf3localStatsDataSourceTb4b4b4.Te6edf3setLocalStatsTb4b4b4(Te6edf3statsTb4b4b4) Tb4b4b4}
Tb4b4b4}
T8b949e/** A reactive map from nodeNum to [Node] objects, representing the entire mesh. */
Tff7b72override Tff7b72val Te6edf3nodeDBbyNumTb4b4b4: Te6edf3StateFlowTff7b72<Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72>Tff7b72> Tff7b72=
Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3nodeDBbyNumFlowTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3mapLatest Tb4b4b4{ Te6edf3map Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3mapValues Tb4b4b4{ Tb4b4b4(Te6edf3_Tb4b4b4, Tffa657itTb4b4b4) Tff7b72-Tff7b72> Tffa657itTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3conflateTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3stateInTb4b4b4(Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4, Te6edf3SharingStartedTb4b4b4.Te6edf3EagerlyTb4b4b4, Te6edf3emptyMapTb4b4b4(Tb4b4b4)Tb4b4b4)
Tff7b72init Tb4b4b4{
T8b949e// Backfill denormalized name columns for existing nodes on startup
Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4.Te6edf3launch Tb4b4b4{
Te6edf3processLifecycleTb4b4b4.Te6edf3repeatOnLifecycleTb4b4b4(Te6edf3LifecycleTb4b4b4.Te6edf3StateTb4b4b4.Te6edf3CREATEDTb4b4b4) Tb4b4b4{
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3backfillDenormalizedNamesTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
T8b949e// Keep ourNodeInfo and myId correctly updated based on current connection and node DB
Te6edf3combineTb4b4b4(Te6edf3nodeDBbyNumTb4b4b4, Te6edf3nodeInfoReadDataSourceTb4b4b4.Te6edf3myNodeInfoFlowTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3dbTb4b4b4, Te6edf3info Tff7b72-Tff7b72> Te6edf3infoTff7b72?.Te6edf3myNodeNumTff7b72?.Te6edf3let Tb4b4b4{ Te6edf3dbTff7b72[Tffa657itTff7b72] Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3onEach Tb4b4b4{ Te6edf3node Tff7b72-Tff7b72>
Te6edf3_ourNodeInfoTb4b4b4.Te6edf3value Tff7b72= Te6edf3node
Te6edf3_myIdTb4b4b4.Te6edf3value Tff7b72= Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3id
Tb4b4b4}
Tb4b4b4.Te6edf3launchInTb4b4b4(Te6edf3processLifecycleTb4b4b4.Te6edf3coroutineScopeTb4b4b4)
Tb4b4b4}
T8b949e/**
* Returns the node number used for log queries. Maps [nodeNum] to [MeshLog.NODE_NUM_LOCAL] (0) if it is the locally
* connected node.
*/
Tff7b72override Tff7b72fun Td2a8ffeffectiveLogNodeIdTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3myNodeInfoFlowTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3info Tff7b72-Tff7b72> Tff7b72if Tb4b4b4(Te6edf3nodeNum Tff7b72=Tff7b72= Te6edf3infoTff7b72?.Te6edf3myNodeNumTb4b4b4) Te6edf3MeshLogTb4b4b4.Te6edf3NODE_NUM_LOCAL Tff7b72else Te6edf3nodeNum Tb4b4b4}
Tb4b4b4.Te6edf3distinctUntilChangedTb4b4b4(Tb4b4b4)
Tff7b72fun Td2a8ffgetNodeEntityDBbyNumFlowTb4b4b4(Tb4b4b4) Tff7b72=
Te6edf3nodeInfoReadDataSourceTb4b4b4.Te6edf3nodeDBbyNumFlowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Te6edf3map Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3mapValues Tb4b4b4{ Tb4b4b4(Te6edf3_Tb4b4b4, Tffa657itTb4b4b4) Tff7b72-Tff7b72> Tffa657itTb4b4b4.Te6edf3toEntityTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
T8b949e/** Returns the [Node] associated with a given [userId]. Falls back to a generic node if not found. */
Tff7b72override Tff7b72fun Td2a8ffgetNodeTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3Node Tff7b72= Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3userTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3userId Tb4b4b4}
Tff7b72?: Te6edf3NodeTb4b4b4(Te6edf3num Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3idToNumTb4b4b4(Te6edf3userIdTb4b4b4) Tff7b72?: T79c0ff0Tb4b4b4, Te6edf3user Tff7b72= Te6edf3getUserTb4b4b4(Te6edf3userIdTb4b4b4)Tb4b4b4)
T8b949e/** Returns the [User] info for a given [nodeNum]. */
Tff7b72override Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3User Tff7b72= Te6edf3getUserTb4b4b4(Te6edf3NodeAddressTb4b4b4.Te6edf3numToDefaultIdTb4b4b4(Te6edf3nodeNumTb4b4b4)Tb4b4b4)
Tff7b72private Tff7b72val Te6edf3last4 Tff7b72= T79c0ff4
T8b949e/** Returns the [User] info for a given [userId]. Falls back to a generic user if not found. */
Tff7b72override Tff7b72fun Td2a8ffgetUserTb4b4b4(Te6edf3userIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3User Tb4b4b4{
Tff7b72val Te6edf3found Tff7b72= Te6edf3nodeDBbyNumTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3find Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3userTb4b4b4.Te6edf3id Tff7b72=Tff7b72= Te6edf3userId Tb4b4b4}Tff7b72?.Te6edf3user
Tff7b72if Tb4b4b4(Te6edf3found Tff7b72!Tff7b72= Tff7b72null Tff7b72&Tff7b72& Te6edf3foundTb4b4b4.Te6edf3long_nameTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tff7b72&Tff7b72& Te6edf3foundTb4b4b4.Te6edf3short_nameTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72return Te6edf3found
Tb4b4b4}
Tff7b72val Te6edf3fallbackId Tff7b72= Te6edf3userIdTb4b4b4.Te6edf3takeLastTb4b4b4(Te6edf3last4Tb4b4b4)
T8b949e// Single equality check replaces two NodeAddress.fromString calls — getUser is called per paged contact
T8b949e// and per text-message arrival, so the parser allocations add up.
Tff7b72val Te6edf3isLocal Tff7b72= Te6edf3userId Tff7b72=Tff7b72= Te6edf3NodeAddressTb4b4b4.Te6edf3ID_LOCAL
Tff7b72val Te6edf3defaultLong Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isLocalTb4b4b4) Tb4b4b4{
Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3userTff7b72?.Te6edf3long_nameTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Ta5d6ff"Ta5d6ffLocalTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Ta5d6ff"Ta5d6ffMeshtastic Tffd700$Te6edf3fallbackIdTa5d6ff"
Tb4b4b4}
Tff7b72val Te6edf3defaultShort Tff7b72=
Tff7b72if Tb4b4b4(Te6edf3isLocalTb4b4b4) Tb4b4b4{
Te6edf3ourNodeInfoTb4b4b4.Te6edf3valueTff7b72?.Te6edf3userTff7b72?.Te6edf3short_nameTff7b72?.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Ta5d6ff"Ta5d6ffLocalTa5d6ff"
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3fallbackId
Tb4b4b4}
Tff7b72return Te6edf3foundTff7b72?.Te6edf3copyTb4b4b4(
Te6edf3long_name Tff7b72= Te6edf3foundTb4b4b4.Te6edf3long_nameTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Te6edf3defaultLongTb4b4b4,
Te6edf3short_name Tff7b72= Te6edf3foundTb4b4b4.Te6edf3short_nameTb4b4b4.Te6edf3takeIf Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3isNotBlankTb4b4b4(Tb4b4b4) Tb4b4b4} Tff7b72?: Te6edf3defaultShortTb4b4b4,
Tb4b4b4) Tff7b72?: Te6edf3UserTb4b4b4(Te6edf3id Tff7b72= Te6edf3userIdTb4b4b4, Te6edf3long_name Tff7b72= Te6edf3defaultLongTb4b4b4, Te6edf3short_name Tff7b72= Te6edf3defaultShortTb4b4b4)
Tb4b4b4}
T8b949e/** Returns a flow of nodes filtered and sorted according to the parameters. */
Tff7b72override Tff7b72fun Td2a8ffgetNodesTb4b4b4(
Te6edf3sortTb4b4b4: Te6edf3NodeSortOptionTb4b4b4,
Te6edf3filterTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3includeUnknownTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onlyOnlineTb4b4b4: Tffa657BooleanTb4b4b4,
Te6edf3onlyDirectTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3FlowTff7b72<Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tff7b72> Tff7b72= Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3getNodesFlowTb4b4b4(
Te6edf3sort Tff7b72= Te6edf3sortTb4b4b4.Te6edf3sqlValueTb4b4b4,
Te6edf3filter Tff7b72= Te6edf3filterTb4b4b4,
Te6edf3includeUnknown Tff7b72= Te6edf3includeUnknownTb4b4b4,
Te6edf3hopsAwayMax Tff7b72= Tff7b72if Tb4b4b4(Te6edf3onlyDirectTb4b4b4) T79c0ff0 Tff7b72else Tff7b72-T79c0ff1Tb4b4b4,
Te6edf3lastHeardMin Tff7b72= Tff7b72if Tb4b4b4(Te6edf3onlyOnlineTb4b4b4) Te6edf3onlineTimeThresholdTb4b4b4(Tb4b4b4) Tff7b72else Tff7b72-T79c0ff1Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3mapLatest Tb4b4b4{ Te6edf3list Tff7b72-Tff7b72> Te6edf3listTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3conflateTb4b4b4(Tb4b4b4)
T8b949e/** Upserts a [Node] to the database. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupsertTb4b4b4(Te6edf3nodeTb4b4b4: Te6edf3NodeTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3nodeTb4b4b4.Te6edf3toEntityTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e/** Installs initial configuration data (local info and remote nodes) into the database. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinstallConfigTb4b4b4(Te6edf3miTb4b4b4: Te6edf3MyNodeInfoTb4b4b4, Te6edf3nodesTb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeTff7b72>Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Tffa657IntTff7b72> Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{
Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3installConfigTb4b4b4(Te6edf3miTb4b4b4.Te6edf3toEntityTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3nodesTb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toEntityTb4b4b4(Tb4b4b4) Tb4b4b4}Tb4b4b4)
Tb4b4b4}
T8b949e/** Deletes all nodes from the database, optionally preserving favorites. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffclearNodeDBTb4b4b4(Te6edf3preserveFavoritesTb4b4b4: Tffa657BooleanTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3clearNodeDBTb4b4b4(Te6edf3preserveFavoritesTb4b4b4) Tb4b4b4}
T8b949e/** Clears the local node's connection info. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffclearMyNodeInfoTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3clearMyNodeInfoTb4b4b4(Tb4b4b4) Tb4b4b4}
T8b949e/** Deletes a node and its metadata by [num]. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffdeleteNodeTb4b4b4(Te6edf3numTb4b4b4: Tffa657IntTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3deleteNodeAndMetadataTb4b4b4(Te6edf3numTb4b4b4) Tb4b4b4}
T8b949e/** Deletes multiple nodes and their metadata. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffdeleteNodesTb4b4b4(Te6edf3nodeNumsTb4b4b4: Te6edf3ListTff7b72<Tffa657IntTff7b72>Tb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3deleteNodesAndMetadataTb4b4b4(Te6edf3nodeNumsTb4b4b4) Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetNodesOlderThanTb4b4b4(Te6edf3lastHeardTb4b4b4: Tffa657IntTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeTff7b72> Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoReadDataSourceTb4b4b4.Te6edf3getNodesOlderThanTb4b4b4(Te6edf3lastHeardTb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetUnknownNodesTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3NodeTff7b72> Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoReadDataSourceTb4b4b4.Te6edf3getUnknownNodesTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3map Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffgetNodeDbSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3MapTff7b72<Tffa657IntTb4b4b4, Te6edf3NodeTff7b72> Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoReadDataSourceTb4b4b4.Te6edf3getNodeDbSnapshotTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3mapValues Tb4b4b4{ Tb4b4b4(Te6edf3_Tb4b4b4, Tffa657itTb4b4b4) Tff7b72-Tff7b72> Tffa657itTb4b4b4.Te6edf3toModelTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
T8b949e/** Persists hardware metadata for a node. */
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffinsertMetadataTb4b4b4(Te6edf3nodeNumTb4b4b4: Tffa657IntTb4b4b4, Te6edf3metadataTb4b4b4: Te6edf3DeviceMetadataTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3upsertTb4b4b4(Te6edf3MetadataEntityTb4b4b4(Te6edf3nodeNumTb4b4b4, Te6edf3metadataTb4b4b4)Tb4b4b4) Tb4b4b4}
T8b949e/** Flow emitting the count of nodes currently considered "online". */
Tff7b72override Tff7b72val Te6edf3onlineNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72> Tff7b72=
Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3nodeDBbyNumFlowTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3mapLatest Tb4b4b4{ Te6edf3map Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3count Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3nodeTb4b4b4.Te6edf3lastHeard Tff7b72> Te6edf3onlineTimeThresholdTb4b4b4(Tb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3conflateTb4b4b4(Tb4b4b4)
T8b949e/** Flow emitting the total number of nodes in the database. */
Tff7b72override Tff7b72val Te6edf3totalNodeCountTb4b4b4: Te6edf3FlowTff7b72<Tffa657IntTff7b72> Tff7b72=
Te6edf3nodeInfoReadDataSource
Tb4b4b4.Te6edf3nodeDBbyNumFlowTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3mapLatest Tb4b4b4{ Te6edf3map Tff7b72-Tff7b72> Te6edf3mapTb4b4b4.Te6edf3valuesTb4b4b4.Te6edf3countTb4b4b4(Tb4b4b4) Tb4b4b4}
Tb4b4b4.Te6edf3flowOnTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4)
Tb4b4b4.Te6edf3conflateTb4b4b4(Tb4b4b4)
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffsetNodeNotesTb4b4b4(Te6edf3numTb4b4b4: Tffa657IntTb4b4b4, Te6edf3notesTb4b4b4: Tffa657StringTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3setNodeNotesTb4b4b4(Te6edf3numTb4b4b4, Te6edf3notesTb4b4b4) Tb4b4b4}
Tff7b72override Tff7b72suspend Tff7b72fun Td2a8ffupdatePowerChannelLabelTb4b4b4(Te6edf3numTb4b4b4: Tffa657IntTb4b4b4, Te6edf3channelIndexTb4b4b4: Tffa657IntTb4b4b4, Te6edf3labelTb4b4b4: Tffa657StringTb4b4b4) Tff7b72=
Te6edf3withContextTb4b4b4(Te6edf3dispatchersTb4b4b4.Te6edf3ioTb4b4b4) Tb4b4b4{ Te6edf3nodeInfoWriteDataSourceTb4b4b4.Te6edf3updatePowerChannelLabelTb4b4b4(Te6edf3numTb4b4b4, Te6edf3channelIndexTb4b4b4, Te6edf3labelTb4b4b4) Tb4b4b4}
Tff7b72private Tff7b72fun Te6edf3MyNodeInfoTb4b4b4.Td2a8fftoEntityTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3MyNodeEntityTb4b4b4(
Te6edf3myNodeNum Tff7b72= Te6edf3myNodeNumTb4b4b4,
Te6edf3model Tff7b72= Te6edf3modelTb4b4b4,
Te6edf3firmwareVersion Tff7b72= Te6edf3firmwareVersionTb4b4b4,
Te6edf3couldUpdate Tff7b72= Te6edf3couldUpdateTb4b4b4,
Te6edf3shouldUpdate Tff7b72= Te6edf3shouldUpdateTb4b4b4,
Te6edf3currentPacketId Tff7b72= Te6edf3currentPacketIdTb4b4b4,
Te6edf3messageTimeoutMsec Tff7b72= Te6edf3messageTimeoutMsecTb4b4b4,
Te6edf3minAppVersion Tff7b72= Te6edf3minAppVersionTb4b4b4,
Te6edf3maxChannels Tff7b72= Te6edf3maxChannelsTb4b4b4,
Te6edf3hasWifi Tff7b72= Te6edf3hasWifiTb4b4b4,
Te6edf3deviceId Tff7b72= Te6edf3deviceIdTb4b4b4,
Te6edf3pioEnv Tff7b72= Te6edf3pioEnvTb4b4b4,
Tb4b4b4)
Tff7b72private Tff7b72fun Te6edf3NodeTb4b4b4.Td2a8fftoEntityTb4b4b4(Tb4b4b4) Tff7b72= Te6edf3NodeEntityTb4b4b4(
Te6edf3num Tff7b72= Te6edf3numTb4b4b4,
Te6edf3user Tff7b72= Te6edf3userTb4b4b4,
Te6edf3position Tff7b72= Te6edf3positionTb4b4b4,
Te6edf3latitude Tff7b72= Te6edf3latitudeTb4b4b4,
Te6edf3longitude Tff7b72= Te6edf3longitudeTb4b4b4,
Te6edf3snr Tff7b72= Te6edf3snrTb4b4b4,
Te6edf3rssi Tff7b72= Te6edf3rssiTb4b4b4,
Te6edf3lastHeard Tff7b72= Te6edf3lastHeardTb4b4b4,
Te6edf3deviceTelemetry Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TelemetryTb4b4b4(Te6edf3device_metrics Tff7b72= Te6edf3deviceMetricsTb4b4b4)Tb4b4b4,
Te6edf3channel Tff7b72= Te6edf3channelTb4b4b4,
Te6edf3viaMqtt Tff7b72= Te6edf3viaMqttTb4b4b4,
Te6edf3hopsAway Tff7b72= Te6edf3hopsAwayTb4b4b4,
Te6edf3isFavorite Tff7b72= Te6edf3isFavoriteTb4b4b4,
Te6edf3isIgnored Tff7b72= Te6edf3isIgnoredTb4b4b4,
Te6edf3isMuted Tff7b72= Te6edf3isMutedTb4b4b4,
Te6edf3environmentTelemetry Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TelemetryTb4b4b4(Te6edf3environment_metrics Tff7b72= Te6edf3environmentMetricsTb4b4b4)Tb4b4b4,
Te6edf3powerTelemetry Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TelemetryTb4b4b4(Te6edf3power_metrics Tff7b72= Te6edf3powerMetricsTb4b4b4)Tb4b4b4,
Te6edf3airQualityTelemetry Tff7b72= Te6edf3orgTb4b4b4.Te6edf3meshtasticTb4b4b4.Te6edf3protoTb4b4b4.Te6edf3TelemetryTb4b4b4(Te6edf3air_quality_metrics Tff7b72= Te6edf3airQualityMetricsTb4b4b4)Tb4b4b4,
Te6edf3paxcounter Tff7b72= Te6edf3paxcounterTb4b4b4,
Te6edf3publicKey Tff7b72= Te6edf3publicKeyTb4b4b4,
Te6edf3notes Tff7b72= Te6edf3notesTb4b4b4,
Te6edf3manuallyVerified Tff7b72= Te6edf3manuallyVerifiedTb4b4b4,
Te6edf3nodeStatus Tff7b72= Te6edf3nodeStatusTb4b4b4,
Te6edf3lastTransport Tff7b72= Te6edf3lastTransportTb4b4b4,
Te6edf3signsPackets Tff7b72= Te6edf3signsPacketsTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Served by rngit 1.5.0 - Generated in 0.09s